home *** CD-ROM | disk | FTP | other *** search
/ PCGUIA 127 / PC Guia 127.iso / Software / Utils / IE View / Bin / ie_view-1.2.7-fx+mz.xpi / chrome / ieview.jar / content / ieviewOverlay.js < prev    next >
Text File  |  2005-10-26  |  27KB  |  1,139 lines

  1. /* 
  2.  *
  3.  * Copyright (c) 2003  Paul Roub <paul@roub.net>
  4.  *
  5.  * $Header: /cvs/ieview/ieview/content/ieviewOverlay.js,v 1.37 2005/10/13 17:02:13 roub Exp $
  6.  *
  7.  * Portions based on GPLed code by
  8.  *     Ted Mielczarek
  9.  *
  10.  * This library is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU Lesser General Public
  12.  * License as published by the Free Software Foundation; either
  13.  * version 2.1 of the License, or (at your option) any later version.
  14.  * 
  15.  * This library is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18.  * Lesser General Public License for more details.
  19.  * 
  20.  * You should have received a copy of the GNU Lesser General Public
  21.  * License along with this library; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  *
  24.  * *****
  25.  *
  26.  * Notes:
  27.  *
  28.  *    Since we can't know ahead of time where IE will be installed, we Kiboze the
  29.  *    Start Menu tree.  If the shortcut has been renamed (i.e. it is no longer
  30.  *    titled "Internet Explorer"), we're out of luck.  The only option at that
  31.  *    point would be to open and dereference every symlink we find, and see if the
  32.  *    target leaf name is "iexplore.exe".  Not doing that at the moment, since
  33.  *    it just seems insane.
  34.  */
  35.  
  36. var    gIeViewBundle;
  37.  
  38. function ieviewAlert(msg)
  39. {
  40.     // alert(msg);
  41. }
  42.  
  43. var IeView = {
  44.    
  45.    ieviewMenuItems: new Array("ieview-do-view", "ieview-do-forcepage"),
  46.    ieviewLinkMenuItems: new Array("ieview-do-viewlink", "ieview-do-forcelink", "ieview-do-forcelink-menu"),
  47.    userPrograms: "Progs",
  48.    allUserPrograms: "CmPrgs",
  49.    applicationData: "AppData",
  50.    
  51.    isJsLink: function(href)
  52.    {
  53.      return(! this.isForceable(href));
  54.    },
  55.  
  56.    enableForceIE: function()
  57.    { 
  58.      var    enabled = true;
  59.      var    pref = this.getBoolPref("ieview.disableForce", false);
  60.  
  61.      if (pref)
  62.      {
  63.     enabled = false;
  64.      }
  65.  
  66.      return(enabled);
  67.    },
  68.    
  69.    closeAfterRedirect: function()
  70.    { 
  71.      var    closeAfter = this.getBoolPref("ieview.closeReloadPage", false);
  72.  
  73.      return(closeAfter);
  74.    },
  75.    
  76.    ieviewContext: function() 
  77.    {
  78.       if (gContextMenu)
  79.       {
  80.          var i;
  81.          var menuitem = null;
  82.  
  83.          for ( i=0; i < this.ieviewMenuItems.length; i++)
  84.          {
  85.             menuitem = document.getElementById(this.ieviewMenuItems[i]);
  86.  
  87.             if (menuitem)      // click-on-page item
  88.             {
  89.                menuitem.hidden = (gContextMenu.isTextSelected || gContextMenu.onLink || gContextMenu.onImage || gContextMenu.onTextInput ) ||
  90.             ((! this.enableForceIE()) && (this.ieviewMenuItems[i].indexOf("force") >= 0));
  91.             }
  92.          }
  93.  
  94.      for ( i = 0; i < this.ieviewLinkMenuItems.length; ++i )
  95.      {
  96.         menuitem = document.getElementById(this.ieviewLinkMenuItems[i]);
  97.       
  98.             if (menuitem)      // click-on-link item
  99.             {
  100.                menuitem.hidden = (! gContextMenu.onLink)  || // no link, no link item
  101.             ((! this.enableForceIE()) && (this.ieviewMenuItems[i].indexOf("force") >= 0));
  102.                
  103.                // disable the link if it's javascript
  104.                //
  105.                var disable = ((! menuitem.hidden) && this.isJsLink(this.contextLinkURL()));
  106.                
  107.                if (disable)
  108.                   menuitem.setAttribute('disabled', 'true');
  109.                else
  110.                   menuitem.setAttribute('disabled', 'false');
  111.             }
  112.          }
  113.       }
  114.    },
  115.    
  116.    ieView: function() 
  117.    {
  118.          var href = gBrowser.currentURI.spec;
  119.          
  120.          this.ieViewLaunch("Internet Explorer.lnk", href);
  121.    },
  122.    
  123.    
  124.    ieViewLink: function() 
  125.    {
  126.       if (gContextMenu)
  127.       {
  128.          var href = this.contextLinkURL();
  129.          
  130.          this.ieViewLaunch("Internet Explorer.lnk", href);
  131.       }
  132.    },
  133.  
  134.    // grab the link URL (if any) from the context menu, accounting for changes
  135.    // between FF 1.0 and 1.5
  136.    //
  137.    contextLinkURL: function()
  138.    {
  139.       if (gContextMenu && gContextMenu.getLinkURL)
  140.     {
  141.         return(gContextMenu.getLinkURL());
  142.     }
  143.     else if (gContextMenu && gContextMenu.linkURL)
  144.     {
  145.         return(gContextMenu.linkURL());
  146.     }
  147.     
  148.     return(false);
  149.    },
  150.  
  151.    saveIeLoc: function(path)
  152.    {
  153.          var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  154.                                .getService(Components.interfaces.nsIPrefService);
  155.  
  156.          var prefs = prefService.getBranch("");
  157.  
  158.          prefs.setCharPref("ieview.ieapp", path);
  159.    },
  160.  
  161.    confirmAdd: function(href)
  162.    {
  163.       var alwaysMessage = "Will always use IE to open URLs beginning with";
  164.  
  165.       try
  166.       {
  167.          alwaysMessage = gIeViewBundle.getString("ieview.alwaysopenwith");
  168.       }
  169.       catch(e)
  170.       {
  171.          alert(e);
  172.      return(false);
  173.       }
  174.      
  175.       alwaysMessage += " " + href;
  176.  
  177.       return( confirm(alwaysMessage) );
  178.    },
  179.  
  180.    addForce: function(href)
  181.    {
  182.     var root = href;
  183.  
  184.         var cls = Components.classes["@mozilla.org/network/io-service;1"];
  185.         var srv = cls.getService(Components.interfaces.nsIIOService);
  186.  
  187.     var uri = false;
  188.  
  189.     try
  190.     {
  191.        uri = srv.newURI(href, null, null);
  192.     }
  193.     catch(e)
  194.     {
  195.         uri = false;
  196.     }
  197.  
  198.     if (uri && uri.prePath && uri.username && uri.userPass)
  199.     {                        
  200.             uri.username = '';
  201.             uri.userPass = '';
  202.  
  203.             root = uri.prePath;
  204.     }
  205.  
  206.     if (! this.confirmAdd(root))
  207.     {
  208.       return(false);
  209.     }
  210.  
  211.         var forces = this.getForceList();
  212.         forces[forces.length] = root;
  213.         var forceStr = forces.join(" ");
  214.  
  215.          var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  216.                                .getService(Components.interfaces.nsIPrefService);
  217.  
  218.          var prefs = prefService.getBranch("");
  219.  
  220.          prefs.setCharPref("ieview.forceielist", forceStr);
  221.  
  222.     return(true);
  223.    },
  224.  
  225.  
  226.    forceLink: function()
  227.    {
  228.         if (! gContextMenu)
  229.         {
  230.                 return;
  231.         }
  232.  
  233.         var href = gContextMenu.linkURL();
  234.         
  235.         this.addForce(href);
  236.  
  237.         this.ieViewLink();
  238.    },
  239.    
  240.    forcePage: function()
  241.    {
  242.          var href = gBrowser.currentURI.spec;
  243.         
  244.         if (this.addForce(href))
  245.     {
  246.        this.ieView();
  247.     }
  248.    },
  249.    
  250.    
  251.    // attempt to grab the real path of a predefined directory
  252.    //
  253.    tryDir: function(dsp, key)
  254.    {
  255.       try
  256.       {
  257.          var nif = dsp.get(key, Components.interfaces.nsIFile);
  258.          return(nif.path);
  259.       }
  260.       catch (ar)
  261.       {
  262.          return("");
  263.       }
  264.    },
  265.    
  266.    
  267.    searchPath: function(path, fname)
  268.    {
  269.       var result = null;
  270.  
  271.       try
  272.       {
  273.          var f = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  274.    
  275.          f.initWithPath(path);
  276.    
  277.          if (f.exists() && f.isDirectory())
  278.          {
  279.             var entries = f.directoryEntries;
  280.    
  281.             while (entries.hasMoreElements())
  282.             {
  283.                var ent = entries.getNext().QueryInterface(Components.interfaces.nsIFile);
  284.    
  285.                if (ent.isDirectory())
  286.                {
  287.                   result = this.searchPath(ent.path, fname);
  288.    
  289.                   if (result)
  290.                   {
  291.                      break;
  292.                   }
  293.                }
  294.                else if (ent.isSymlink())
  295.                {
  296.                   if (ent.leafName.toLowerCase() == fname.toLowerCase())
  297.                   {
  298.                      result = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  299.                      result.followLinks = true;
  300.                      result.initWithPath(ent.path);
  301.    
  302.                      if (result.target == "")
  303.                      {
  304.                         result = null;
  305.                      }
  306.                      else
  307.                      {
  308.                         break;
  309.                      }
  310.                   }
  311.                }
  312.                else if (ent.isFile())
  313.                {
  314.                   if (ent.leafName.toLowerCase() == fname.toLowerCase())
  315.                   {
  316.                      result = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  317.                      result.initWithPath(ent.path);
  318.                      break;
  319.                   }
  320.                }
  321.             }
  322.          }
  323.       }
  324.       catch (ar)
  325.       {
  326.          return(null);
  327.       }
  328.    
  329.       return( result );
  330.    },
  331.    
  332.    
  333.    ievtrim: function(st) 
  334.    {
  335.       var result = st.replace( /^\s+/g, "" );
  336.       result = result.replace( /\s+$/g, "" );
  337.       return(result);
  338.    },
  339.    
  340.    
  341.    deQuote: function(st)
  342.    {
  343.       var result = this.ievtrim(st);
  344.  
  345.       if ((result.length >= 2) &&
  346.           (result.charAt(0) == '"') &&
  347.           (result.charAt(result.length - 1) == '"')
  348.          )
  349.       {
  350.          result = this.ievtrim(result.substr(1, result.length - 2));
  351.       }
  352.  
  353.       return(result);
  354.    },
  355.  
  356.    getBoolPref: function(prefName, defval)
  357.    {
  358.     var    result = defval;
  359.  
  360.         var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  361.         var prefs = prefservice.getBranch("");
  362.  
  363.         if (prefs.getPrefType(prefName) == prefs.PREF_BOOL)
  364.         {
  365.        result = prefs.getBoolPref(prefName);
  366.     }
  367.  
  368.     return(result);
  369.    },
  370.  
  371.    getForceList: function()
  372.    {  
  373.         var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  374.         
  375.         var prefs = prefservice.getBranch("");
  376.         var forces = new Array();
  377.         
  378.         if (prefs.getPrefType("ieview.forceielist") == prefs.PREF_STRING)
  379.         {
  380.             var forceList = this.deQuote(prefs.getCharPref("ieview.forceielist"));
  381.             forces = forceList.split(" ");
  382.         
  383.             var msg = "force list:\r\n";
  384.             
  385.             var i;
  386.             
  387.             for (i = 0; i < forces.length; ++i )
  388.             {
  389.                 msg += forces[i] + "\r\n";
  390.             }
  391.         }
  392.         
  393.         return(forces);
  394.    },
  395.  
  396.  
  397.    ieViewLaunch: function (path,argumentstext)
  398.    {
  399.       var cantMessage = "can't find";
  400.  
  401.       if (! this.isForceable(argumentstext))
  402.     {
  403.         return(false);
  404.     }
  405.  
  406.       try
  407.       {
  408.          cantMessage = gIeViewBundle.getString("ieview.cantFindExplorer");
  409.       }
  410.       catch(e)
  411.       {
  412.          alert(e);
  413.       }
  414.  
  415.       var prefservice = Components.classes["@mozilla.org/preferences-service;1"].
  416.                         getService(Components.interfaces.nsIPrefService);
  417.  
  418.       var prefs = prefservice.getBranch("");
  419.  
  420.       try
  421.       {
  422.          if (path=="") 
  423.         return(false);
  424.  
  425.          var ieloc = null;
  426.  
  427.          if (prefs.getPrefType("ieview.ieapp") == prefs.PREF_STRING)
  428.          {
  429.             ieloc = this.deQuote(prefs.getCharPref("ieview.ieapp"));
  430.  
  431.             if (this.trim(ieloc) == "")
  432.             {
  433.                 ieloc = null;
  434.             }
  435.          }
  436.  
  437.          var   natTarget = null;
  438.          var   usePath = null;
  439.  
  440.          if (ieloc != null)
  441.          {
  442.             natTarget = ieloc;
  443.          }
  444.          else
  445.          {
  446.             var dsprops = Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties);
  447.  
  448.             usePath = this.tryDir(dsprops, this.userPrograms);    // try user-specific program menu first
  449.  
  450.             var file = null;
  451.  
  452.             if (usePath != "")
  453.             {
  454.                file = this.searchPath(usePath, path);
  455.             }
  456.  
  457.             if (! file)
  458.             {
  459.                usePath = this.tryDir(dsprops, this.allUserPrograms);   // no joy?  try "all users" program menu
  460.  
  461.                if (usePath != "")
  462.                {
  463.                   file = this.searchPath(usePath, path);
  464.                }
  465.             }
  466.  
  467.             if (! file)
  468.             {
  469.                usePath = this.tryDir(dsprops, this.applicationData);   // last resort, check the "quick start" bar
  470.  
  471.                if (usePath != "")
  472.                {
  473.                   var   quickPath = "\\microsoft\\internet explorer\\quick launch";
  474.  
  475.                   usePath = usePath + quickPath;
  476.  
  477.                   file = this.searchPath(usePath, path);
  478.  
  479.                   if (! file)    // check alternate QuickLaunch bar title
  480.                   {
  481.                      var launchLink = "Launch Internet Explorer Browser.lnk";
  482.  
  483.                      file = this.searchPath(usePath, launchLink);
  484.                   }
  485.                }
  486.             }
  487.  
  488.             // last ditch -- find the windows directory
  489.             // assume that the main Program Files directory is on the same drive
  490.             // look in there, under Program Files\Internet Explorer, for iexplore.exe
  491.             //
  492.             if (! file)
  493.             {
  494.                usePath = this.tryDir(dsprops, "WinD");
  495.  
  496.                if ((usePath != "") && (usePath.charAt(1) == ":"))
  497.                {
  498.                   usePath = usePath.substr(0, 2) + "\\program files\\internet explorer";
  499.  
  500.                   file = this.searchPath(usePath, "iexplore.exe");
  501.                }
  502.             }
  503.  
  504.             if ((! file) || (! file.exists()))
  505.             {
  506.                alert(cantMessage);
  507.                return false;
  508.             }
  509.  
  510.             natTarget = file.target;
  511.             this.saveIeLoc(natTarget);
  512.          }
  513.  
  514.          var targetFile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  515.  
  516.          try
  517.          {
  518.             targetFile.initWithPath(natTarget);
  519.          }
  520.          catch(e)
  521.          {
  522.             alert(cantMessage);
  523.             return(false);
  524.          }
  525.  
  526.          if (! targetFile.exists())
  527.          {
  528.             alert(cantMessage);
  529.             return(false);
  530.          }
  531.  
  532.          usePath = targetFile.target;
  533.  
  534.          var process = Components.classes['@mozilla.org/process/util;1'].getService(Components.interfaces.nsIProcess);
  535.          process.init(targetFile);
  536.          var arguments= [] ;
  537.  
  538.          arguments.push(argumentstext);
  539.  
  540.          process.run(false, arguments, arguments.length,{});
  541.          return true;
  542.  
  543.       }
  544.       catch (e)
  545.       {
  546.          alert(e);
  547.          return false;
  548.       }
  549.  
  550.       return false;     // avoid JavaScript Error.
  551.    },
  552.  
  553.  
  554.    ieviewInit: function()
  555.    {
  556.       var   i;
  557.       var menu = document.getElementById("contentAreaContextMenu");
  558.  
  559.       if (menu)
  560.       {
  561.          menu.addEventListener("popupshowing", ieviewContextListener,false);
  562.       }
  563.  
  564.       gIeViewBundle = document.getElementById("bundle_ieview");
  565.  
  566.       var   docHref = this.getDocHref();
  567.  
  568.       if (docHref == "")
  569.       {
  570.          docHref = document.location.href;
  571.       }
  572.  
  573.       if (docHref.substring(0, 7) != 'chrome:')
  574.       {
  575.          if (! gIeViewBundle)
  576.          {
  577.             alert("no bundle");
  578.          }
  579.       }
  580.  
  581.       var appcontent = document.getElementById("appcontent");   // browser
  582.  
  583.       if (appcontent)
  584.       {
  585.          appcontent.addEventListener("load", ieviewLoadListener, true);
  586.       }
  587.    },
  588.  
  589.    isForceable: function(href) {
  590.     return( (typeof(href) != 'undefined') && (href.substr) &&
  591.                 (this.startsWith(href, 'http://') ||
  592.                  this.startsWith(href, 'https://') ||
  593.                  this.startsWith(href, 'file://') ||
  594.                  this.startsWith(href, 'ftp://') 
  595.                 )
  596.           );
  597.    },
  598.  
  599.    hideMenu: function(aEvent)
  600.    {
  601.        var i;
  602.        var doc = aEvent.originalTarget;
  603.  
  604.       var href = '';
  605.  
  606.        if (doc.location && doc.location.href)
  607.         {
  608.             href = doc.location.href;
  609.         }
  610.  
  611.  
  612.        var menuitem = document.getElementById('ieview-do-forcepage-menu');
  613.  
  614.        if (! menuitem)
  615.     {
  616.        if (doc.getElementById)
  617.        {
  618.              menuitem = doc.getElementById('ieview-do-forcepage-menu');
  619.            }
  620.     }
  621.  
  622.     if (! menuitem)
  623.     {    
  624.                menuitem = document.getElementById('ieview-do-forcepage-menu-moz');
  625.     }
  626.  
  627.        if (! menuitem)
  628.     {
  629.        if (doc.getElementById)
  630.            {
  631.           menuitem = doc.getElementById('ieview-do-forcepage-menu-moz');
  632.            }
  633.     }
  634.  
  635.        if (menuitem)      // click-on-page item
  636.         {
  637.        var enabled = this.enableForceIE() && this.isForceable(href);
  638.  
  639.                   menuitem.setAttribute('disabled', enabled ? 'false' : 'true');
  640.  
  641.         }
  642.  
  643.     var tbutton = document.getElementById("ieview-button");
  644.  
  645.     if (tbutton)
  646.     {
  647.        enabled = this.isForceable(href);
  648.        tbutton.setAttribute('disabled', enabled ? 'false' : 'true');
  649.        tbutton.disabled = ! enabled;
  650.     }
  651.    },
  652.  
  653.    grabLinks: function(aEvent)
  654.    {
  655.        var i;
  656.        var doc = aEvent.originalTarget;
  657.  
  658.        if ((! this.enableForceIE()) || (! doc) || (! doc.getElementsByTagName))
  659.     {
  660.       return;
  661.     }
  662.  
  663.        var links = doc.getElementsByTagName('a');
  664.  
  665.        for (i = 0; i < links.length; ++i)
  666.        {
  667.            var   ln = links[i];
  668.  
  669.        if (ln && ln.href && this.isForceable(ln.href))
  670.        {
  671.               ln.addEventListener('click', this.ieviewClick, true);
  672.            }
  673.        }
  674.    },
  675.  
  676.    //    check whether the document behind a dom-loaded event is framed
  677.    //
  678.    isFramed: function(aEvent)
  679.    {
  680.     var framed = aEvent.originalTarget && 
  681.         window._content && window._content.document &&
  682.         (window._content.document != aEvent.originalTarget);
  683.  
  684.     return(framed);
  685.   },
  686.  
  687.  
  688.    checkForced: function(aEvent)
  689.    {
  690.        var i;
  691.        var doc = aEvent.originalTarget;
  692.  
  693.        if (! this.enableForceIE())
  694.     {
  695.       return;
  696.     }
  697.  
  698.     // only want to reload the topmost frame
  699.     //
  700.     if (this.isFramed(aEvent))
  701.     {
  702.       return;
  703.     }
  704.  
  705.        if (doc.location && doc.location.href && this.forceIe(doc.location.href))
  706.     {
  707.       var ws = gBrowser.docShell.QueryInterface(Components.interfaces.nsIRefreshURI);
  708.  
  709.       if (ws)
  710.       {
  711.           ws.cancelRefreshURITimers();
  712.       }
  713.  
  714.     doc.location.href = "chrome://ieview/content/reloaded.html";
  715.  
  716.       var head = null;
  717.  
  718.       var heads = doc.getElementsByTagName('head');
  719.  
  720.       if (heads && heads.length > 0)
  721.       {
  722.         head = heads[0];
  723.          }
  724.       else
  725.       {
  726.         heads = doc.getElementsByTagName('HEAD');
  727.  
  728.         if (heads && heads.length > 0)
  729.         {
  730.           head = heads[0];
  731.            }
  732.       }
  733.  
  734.       if (head)
  735.       {
  736.         head.innerHTML = "<title>IE View " + gIeViewBundle.getString("ieview.reloaded") + "</title>";
  737.       }
  738.  
  739.       this.ieViewLaunch("Internet Explorer.lnk", doc.location.href);
  740.  
  741.       if (this.closeAfterRedirect() && gBrowser.browsers && gBrowser.getBrowserAtIndex)
  742.       {
  743.         if (gBrowser.browsers.length < 2)
  744.         {
  745.             window.close();
  746.         }
  747.         else
  748.         {
  749.             var l = gBrowser.browsers.length;
  750.             for ( var i = 0; i < l; ++i )
  751.             {
  752.                 if (gBrowser.getBrowserAtIndex(i).contentDocument == doc)
  753.                 {
  754.                     if (i == 0)
  755.                     {
  756.                         gBrowser.tabContainer.advanceSelectedTab(1);
  757.                     }
  758.                     else
  759.                     {
  760.                         gBrowser.tabContainer.advanceSelectedTab(-1);
  761.                     }
  762.                     
  763.                     gBrowser.tabContainer.removeItemAt(i);
  764.                     break;
  765.                 }
  766.             }
  767.         }
  768.       }
  769.     }
  770.    },
  771.  
  772.    startsWith: function(st, pref)
  773.    {
  774.       return( (pref.length > 0) && (st.substring(0, pref.length) == pref) );
  775.         
  776.    },
  777.  
  778.    isMatch: function(url, pattern)
  779.    {
  780.         if ((pattern == null) || (pattern == ""))
  781.         {
  782.        return(false);
  783.         }
  784.  
  785.         var     repat = pattern;
  786.  
  787.         repat = repat.replace(/\\/, "\\\\");
  788.         repat = repat.replace(/\./g, "\\.");
  789.         repat = repat.replace(/\?/g, "\\?");
  790.         repat = repat.replace(/\//g, "\\/");
  791.         repat = repat.replace(/\*/g, ".*");
  792.         repat = repat.replace(/\{/g, "\\{");
  793.         repat = repat.replace(/\}/g, "\\}");
  794.         repat = repat.replace(/\.\*\\\./g, ".*\\.?\\b");
  795.         repat = "^" + repat;
  796.  
  797.         var     reg = new RegExp(repat);
  798.  
  799.         var     matched = (reg.test(url));
  800.  
  801.         return(matched);
  802.    },
  803.  
  804.    forceIe: function(href)
  805.    {
  806.        var skipList = this.getForceList();
  807.  
  808.        for (i = 0; i < skipList.length; ++i)
  809.        {
  810.            if (this.isMatch(href, skipList[i]))
  811.            {
  812.                ieviewAlert(href + " matches " + skipList[i]);
  813.                return(true);
  814.            }
  815.        }
  816.  
  817.        return(false);
  818.    },
  819.  
  820.    ieviewClick: function(aEvent)
  821.    {
  822.        var link = aEvent.originalTarget;
  823.  
  824.        if ((! link) || (! link.href))
  825.        {
  826.            link = aEvent.currentTarget;
  827.        }
  828.     
  829.        if ((! link) || (! link.href))
  830.        { 
  831.            return(true);
  832.        }
  833.  
  834.        if (IeView.forceIe(link.href))
  835.        {
  836.        aEvent.preventDefault();
  837.            IeView.ieViewLaunch("Internet Explorer.lnk", link.href);
  838.            return(false);
  839.        }
  840.  
  841.     return(true);
  842.    },
  843.  
  844.    setIeviewOptions: function()
  845.    {
  846.          var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  847.                                .getService(Components.interfaces.nsIPrefService);
  848.  
  849.          var prefs = prefService.getBranch("");
  850.  
  851.          prefs.setCharPref("ieview.ieapp", document.getElementById('ieloc').value);
  852.  
  853.          prefs.setCharPref("ieview.forceielist", this.getPrefListString());
  854.  
  855.         var disableAlways = document.getElementById('disableAlways');
  856.     var closeAfter = document.getElementById('closeAfterRedir');
  857.  
  858.     prefs.setBoolPref("ieview.disableForce", disableAlways.checked);
  859.     prefs.setBoolPref("ieview.closeReloadPage", closeAfter.checked);
  860.  
  861.       window.close();
  862.    },
  863.  
  864.    pickIe: function()
  865.    {
  866.        var picker = Components.classes["@mozilla.org/filepicker;1"].getService(Components.interfaces.nsIFilePicker);
  867.  
  868.        picker.init(window, "Choose Browser", 0);
  869.        picker.appendFilters(64);
  870.  
  871.        if (picker.show() == 0)
  872.        {
  873.            document.getElementById('ieloc').value = picker.file.target;
  874.        }
  875.    },
  876.  
  877.  
  878.    initPath: function()
  879.    {
  880.        var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  881.  
  882.        var prefs = prefservice.getBranch("");
  883.  
  884.        var ieloc = null;
  885.  
  886.        if (prefs.getPrefType("ieview.ieapp") == prefs.PREF_STRING)
  887.        {
  888.          ieloc = prefs.getCharPref("ieview.ieapp");
  889.        }
  890.  
  891.        if ((ieloc != null) && (ieloc.length > 0))
  892.        {
  893.            document.getElementById('ieloc').value = ieloc;
  894.        }
  895.  
  896.        var skips = this.getForceList();
  897.  
  898.         var listbox = document.getElementById('patlist');
  899.  
  900.         if (! listbox)
  901.         {
  902.             alert('no listbox');
  903.         }
  904.         else
  905.         {
  906.             var i;
  907.             
  908.             for ( i = 0; i < skips.length; ++i )
  909.             {
  910.         if (skips[i] != '')
  911.         {
  912.                     listbox.appendItem(skips[i]); 
  913.         }    
  914.             }
  915.         }
  916.  
  917.        prefs = null;
  918.  
  919.        var np = document.getElementById('newpat');
  920.        
  921.        np.disabled = ! this.enableForceIE();
  922.        listbox.disabled = ! this.enableForceIE();
  923.  
  924.         var disableAlways = document.getElementById('disableAlways');
  925.     disableAlways.checked = ! this.enableForceIE();
  926.  
  927.     var closeAfter = document.getElementById('closeAfterRedir');
  928.     closeAfter.checked = this.closeAfterRedirect();
  929.        
  930.    },
  931.  
  932.    updateDelButtonStatus: function()
  933.    {
  934.         var lb = document.getElementById('patlist');
  935.         var bt = document.getElementById('delpat');
  936.  
  937.         bt.disabled = (lb.selectedItems.length < 1) || ! this.enableForceIE();        
  938.    },
  939.  
  940.    compareNum: function(a,b)
  941.    {
  942.      return(b-a);
  943.    },
  944.  
  945.    deleteSelected: function()
  946.    {
  947.         var lb = document.getElementById('patlist');
  948.         var selected = lb.selectedItems;
  949.         var indexes = new Array();
  950.  
  951.         var i;
  952.  
  953.         for ( i  = 0; i < selected.length; ++i )
  954.         {
  955.             var item = selected[i];
  956.  
  957.             var idx = lb.getIndexOfItem(item);
  958.     
  959.             indexes[i] = idx;
  960.         }
  961.  
  962.         indexes.sort(this.compareNum);
  963.  
  964.         for ( i = 0; i < indexes.length; ++i )
  965.         {
  966.             lb.removeItemAt(indexes[i]);
  967.         }
  968.  
  969.         this.updateDelButtonStatus();
  970.    },
  971.  
  972.  
  973.    updateButtonStatus: function()
  974.    {
  975.         var tb = document.getElementById('newpat');
  976.         var bt = document.getElementById('addpat');
  977.  
  978.         bt.disabled = (this.trim(tb.value).length < 1);        
  979.    },
  980.  
  981.    addNewPat: function()
  982.    {
  983.         var tb = document.getElementById('newpat');
  984.  
  985.         var newstr = tb.value;
  986.  
  987.         if (newstr.indexOf("://") < 0)
  988.         {
  989.             newstr = "http://" + newstr;
  990.         }
  991.  
  992.         var        listbox = document.getElementById('patlist');
  993.  
  994.         listbox.appendItem(this.trim(newstr));
  995.  
  996.         tb.value = "";
  997.         this.updateButtonStatus();
  998.    },
  999.  
  1000.    getPrefListString: function()
  1001.    {
  1002.         var result = "";
  1003.  
  1004.         var        listbox = document.getElementById('patlist');
  1005.         var rows = listbox.getRowCount();
  1006.         var i;
  1007.  
  1008.         for ( i = 0; i < rows; ++i )
  1009.         {
  1010.           var li = listbox.getItemAtIndex(i);
  1011.         
  1012.           if (result != "")
  1013.           {
  1014.                 result += " ";
  1015.           }
  1016.  
  1017.           result += li.label;
  1018.         }
  1019.  
  1020.         return(result);
  1021.    },
  1022.  
  1023.    trim: function(st)
  1024.    {
  1025.         var result = st;
  1026.  
  1027.         while ((result.length > 0) && (result.substring(0,1) == " "))
  1028.         {
  1029.                 result = result.substring(1);
  1030.          }
  1031.  
  1032.         while ((result.length > 0) && (result.substring(st.length - 1, 1) == " "))
  1033.         {
  1034.                 result = result.substring(0, result.length - 1);
  1035.         }
  1036.  
  1037.         return(result);
  1038.    },
  1039.  
  1040.    getDocHref: function()
  1041.    {
  1042.       if (typeof(XPCNativeWrapper) == "undefined")
  1043.       {
  1044.          return("");
  1045.       }
  1046.  
  1047.       var href = false;
  1048.       var locWrapper = false;
  1049.  
  1050.       try
  1051.       {
  1052.         var winWrapper = new XPCNativeWrapper(window._content, 'document');
  1053.         var docWrapper = new XPCNativeWrapper(winWrapper.document, 'location');
  1054.         locWrapper = new XPCNativeWrapper(docWrapper.location, 'href');
  1055.  
  1056.     href = locWrapper.href;
  1057.       }
  1058.       catch(e)
  1059.       {
  1060.     locWrapper = new XPCNativeWrapper(window, 'location', 'href');
  1061.     href = locWrapper.location.href;
  1062.       }
  1063.  
  1064.       return(href);
  1065.    }
  1066. };
  1067.  
  1068.  
  1069. function ieviewLaunchOptions()
  1070. {
  1071.             window.openDialog("chrome://ieview/content/ieviewsettings.xul", "ieviewsettings", 
  1072.               "resizable,centerscreen,modal");
  1073. }
  1074.  
  1075. function ieviewContextListener(aEvent)
  1076. {
  1077.   return(IeView.ieviewContext(aEvent));
  1078. }
  1079.  
  1080. function ieviewLoadListener(aEvent)
  1081. {
  1082.    IeView.hideMenu(aEvent);
  1083.  
  1084.    return(IeView.grabLinks(aEvent));
  1085. }
  1086.  
  1087. function ieviewCheckForcedListener(aEvent)
  1088. {
  1089.    IeView.checkForced(aEvent);
  1090. }
  1091.  
  1092. function ieviewInitListener(aEvent)
  1093. {
  1094.    return(IeView.ieviewInit(aEvent));
  1095. }
  1096.  
  1097. // do the init on load
  1098. window.addEventListener("load", ieviewInitListener, false);
  1099. window.addEventListener("DOMContentLoaded", ieviewCheckForcedListener, false);
  1100.  
  1101. if (typeof(BookmarksCommand) != "undefined")
  1102. {
  1103.    if (BookmarksCommand.openOneBookmark && (! BookmarksCommand.oldOpenOneBookmark) && IeView.enableForceIE())
  1104.    {
  1105.        BookmarksCommand.oldOpenOneBookmark = BookmarksCommand.openOneBookmark;
  1106.    
  1107.        BookmarksCommand.openOneBookmark = function(aURI, aTargetBrowser, aDS) {
  1108.  
  1109.            var namespaceVar = null;
  1110.  
  1111.            if (typeof(gNC_NS) != "undefined")
  1112.            {
  1113.               namespaceVar = gNC_NS;
  1114.            }
  1115.            else if (typeof(NC_NS) != "undefined")
  1116.            {
  1117.               namespaceVar = NC_NS;
  1118.            }
  1119.            else
  1120.            {
  1121.               alert('no namespace var');
  1122.            }
  1123.    
  1124.            var url = BookmarksUtils.getProperty(aURI, namespaceVar+"URL", aDS);
  1125.    
  1126.            if (IeView.forceIe(url))
  1127.            {
  1128.                IeView.ieViewLaunch("Internet Explorer.lnk", url);
  1129.                return;
  1130.            }
  1131.            else
  1132.            {
  1133.                BookmarksCommand.oldOpenOneBookmark(aURI, aTargetBrowser, aDS);
  1134.            }
  1135.        };
  1136.    }
  1137. }
  1138.  
  1139.